package ve.conexion;

import java.io.*;
import java.net.*;
import java.util.Date;
import java.util.Random;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class Interfaz extends Activity {

	BufferedReader in = null;
	PrintWriter out = null;
	String Directorio = "";

	public static final String PREFS_NAME = "MyPrefsFileInt";
	

	Thread background = null;
	boolean stop = false;
	String fila = "";
	String listo = "";
	int dormir = 10000;
	int peticion = 1000;
	
	
	/** Se llama cuando la actividad es creada por primera vez. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Deberia crear el hilo secundario.
		// Cargo las preferrencias
		cargarPref();
		// Voy a la pantalla de inicio
		ini();
	}

	@Override
	protected void onStop() {
		super.onStop();
		guardarPref();
	}

	public void cargarPref() {
		// Restore preferences
		SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
		Directorio = settings.getString("dir", "Compartido");
		dormir = settings.getInt("dormir", 10000);
		peticion = settings.getInt("peticion", 10000);
		Log.i("@@@@@@@@@@@@@@@@@@@@", "Cargó Pref");
	}

	public void guardarPref() {
		// We need an Editor object to make preference changes.
		// All objects are from android.context.Context
		SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
		SharedPreferences.Editor editor = settings.edit();
		editor.putString("dir", Directorio);
		editor.putInt("dormir", dormir);
		editor.putInt("peticion", peticion);
		
		// Commit the edits!
		editor.commit();
		Log.i("@@@@@@@@@@@@@@@@@@@@", "Guardó Pref");
	}

	public void ini() {

		setContentView(R.layout.ini); //Layout Pag Principal
		
		final Button opcionesIni = (Button) findViewById(R.id.Opciones);
		final Button TerminalIni = (Button) findViewById(R.id.PantallaEstado);
		final Button SalirIni = (Button) findViewById(R.id.Salir);

		opcionesIni.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Opciones();
			}
		});

		TerminalIni.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Terminal();
			}
		});

		SalirIni.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Salir();
			}
		});
		android.util.Log.v("@@@@@@@@@@@@@@@@@@@@", "Cargó Ini");
	}

	public void Opciones() {

		setContentView(R.layout.opciones);
		
		final EditText TextDirectorio = (EditText) findViewById(R.id.carpeta);
		final EditText TiempoSync = (EditText) findViewById(R.id.mseg);
		
		final Button AtrasOpciones = (Button) findViewById(R.id.Atras);
		final Button guardarOpciones = (Button) findViewById(R.id.Guardar);


		TextDirectorio.setText(Directorio);
		TiempoSync.setText(""+dormir);
		
		AtrasOpciones.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				ini();
			}
		});

		guardarOpciones.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Guardar();
			}
		});

	}

	// Aqui lo que se hace es que se guarda en las propiedades locales
	// las configuraciones para que esten disponibles para la proxima vez
	// que se necesiten
	// Ver http://developer.android.com/guide/topics/data/data-storage.html#pref
	public void Guardar() {
		final EditText dir = (EditText) findViewById(R.id.carpeta);
		final EditText TiempoSync = (EditText) findViewById(R.id.mseg);
		

		try{
			Directorio = dir.getText().toString().trim();
			dormir = Integer.parseInt(TiempoSync.getText().toString().trim());
			// hay que cambiar a tiempo sync 2
			peticion = Integer.parseInt(TiempoSync.getText().toString().trim());
		} catch(Exception e){
			
		}
			
		if (Directorio.length() == 0 || TiempoSync.length() == 0 || dormir == 0)
			displayERR("No se han podido guardar las opciones, chequee los datos.");
		// Si todo va bien se retorna al inicio.
		else {
			guardarPref();
			ini();
		}
	}

	public void Terminal() {

		setContentView(R.layout.main);

		final Button StartB = (Button) findViewById(R.id.Start);
		final Button StopB = (Button) findViewById(R.id.Stop);
		final Button AtrasTerminal = (Button) findViewById(R.id.Atras);
		
		StartB.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				final TextView terminal = (TextView) findViewById(R.id.terminal);
				final ScrollView scroll = (ScrollView) findViewById(R.id.S);
				final Button start = (Button) findViewById(R.id.Start);
				start.setEnabled(false);
				final Button Stop = (Button) findViewById(R.id.Stop);
				Stop.setEnabled(true);
				terminal.append("Background Process Initiated\n");
				stop = false;
				preSimular();
			}
		});

		StopB.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				final TextView terminal = (TextView) findViewById(R.id.terminal);
				final ScrollView scroll = (ScrollView) findViewById(R.id.S);
				final Button stop = (Button) findViewById(R.id.Stop);
				stop.setEnabled(false);
				final Button start = (Button) findViewById(R.id.Start);
				start.setEnabled(true);
				terminal.append("Background Process Stopped\n");
				interrupt();
			}
		});

		AtrasTerminal.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				ini();
			}
		});

	}

	

	// Simula la recepcion de datos
	public String Simular() {

		return "\t<datos>\n" +
			"\t\t<presion>"+numValido(100)+"</presion>\n"+
			"\t\t<temperatura>"+numValido(100)+"</temperatura>\n"+
			"\t\t<viento>"+numValido(100)+"</viento>\n"+
			"\t\t<humedad>"+numValido(100)+"</humedad>\n"+
			"\t\t<precipitacion>"+numValido(100)+"</precipitacion>\n\t</datos>\n";

	}

	// Genera un numero valido entre 1 e i
	public int numValido(int i) {
		int x = 0;
		Random rand = new Random();

		do {
			x = rand.nextInt(i);
		} while (x == 0);

		return x;
	}

	// Se encarga de Verificar que al salir no se deje el socket abierto
	public void Salir() {

		System.exit(0);
	}


	// Debe sacar un error con un popup
	public void displayERR(String err) {

	}
	
	
	public void preSimular(){
		
        background = new Thread (new Runnable() {
            public void run() {
            	File ruta = Environment.getExternalStorageDirectory();
        		File subdirectory = new File(ruta, "/"+Directorio);
        		subdirectory.mkdirs(); 
        		String Fecha = "";
        		String Hora = "";
        		String Nombre = "";
        		File gpxfile;
        		Date d;
        		FileWriter escibir;
        		
        		int i;
        		
                try {
                	while(!stop){
                		i = 5;
                		d = new Date();
                		Fecha = ""+DateFormat.format("dd_MM_yyyy",d);
                		Hora = d.toString().substring((d.toString().length()-24),(d.toString().length()-15));
                		Hora = Hora.replaceAll(":", "-");
                		System.out.println("Hora: " + Hora);
                		Nombre = Fecha + Hora+".xml";

                		
                	    fila = "<archivo>\n\t<id>\n"+
                		"\t\t<fecha>"+Fecha+"</fecha>\n"+
                		"\t\t<hora>"+Hora+"</hora>\n\t</id>\n";
                	    
                	    //Llenamos los 10 datos por archivo xml
                	    while (i>0){
                	    	System.out.println("PIDO AL SERVIDOR");
                	    	fila += Simular();
                	    	i--;
                	    	// esperamos un seg entre cada solicitud
                	    	Thread.sleep(dormir);
                	    }
                	    
                	    fila += "</archivo>";
                	    listo = fila;
                	    // creo, escribo y guardo rápido
                		gpxfile = new File(subdirectory, Nombre);
            			escibir = new FileWriter(gpxfile);
            			escibir.append(listo);
            			escibir.flush();
            			escibir.close();
            			
                		// active the update handler
                		Message msg = new Message();
                		msg.what = 1;
                		//  espero el tiempo para crear el otro archivo
                		//Thread.sleep(dormir); // se supone que el duerme hasta completar el archivo
                		progressHandler.sendMessageDelayed(msg, 1000);
                		
                    }
                } catch (Exception e) {
        			System.out.print("!!!Excepcion! ");
        			e.printStackTrace();
                }
            }
         });
         // start the background thread
         background.start();
	}
    
	// Se ejecuta al presionar el botón de stop.
    public void interrupt(){
    	stop = true;
        if(background!=null && background.isAlive())
        	background.interrupt();
    }
    

    // Este handler se encarga de Imprimir en la pantalla los datos del archivo
    Handler progressHandler = new Handler() {
        public void handleMessage(Message msg) {
        	
        	final TextView terminal = (TextView) findViewById(R.id.terminal);
        	final ScrollView scroll = (ScrollView) findViewById(R.id.S);
        	// Se adjunta todo a la consola
        	terminal.append(listo + "\n");
        	scroll.setFocusable(true);
        	scroll.scrollBy(0, 12 * (terminal.getLineCount() + 1));
        	
        }
    };

}